// 导入axios
import axios from 'axios'
import { getToken, saveToken, removeToken } from './token.js'
import { Toast } from 'vant'
import router from '../router/index.js'
// 导入jsonbiginit依赖 解决js大数精度丢失问题
import JSONbig from 'json-bigint'

// 创建一个axios 自定义实例
const instance = axios.create({
  baseURL: 'http://toutiao-app.itheima.net',
  timeout: 8000,
  transformResponse: [
    function (data) {
      // 对 data 进行任意转换处理
      try {
        return JSONbig.parse(data)
      } catch (error) {
        return data
      }
    }
  ]
})

// 使用axios请求拦截器实现token自动上传
instance.interceptors.request.use(
  function (config) {
    // 请求的信息
    // console.dir(config)
    if (getToken()) {
      config.headers.Authorization = `Bearer ${getToken().token}`
    }
    return config
  },
  function (error) {
    // 请求错误
    // console.dir(error)
    return Promise.reject(error)
  }
)

// 使用axios响应实现token拦截与自动刷新
instance.interceptors.response.use(
  function (response) {
    // 响应的信息
    // console.dir(response)
    return response
  },
  async function (error) {
    // 响应的错误信息
    // console.dir(error)

    // 判断是不是401报错
    if (error.response && error.response.status == 401) {
      // 是401报错，并判断有没有token值用户有没有登录
      if (getToken()) {
        try {
          const res = await axios({
            url: 'http://toutiao-app.itheima.net/v1_0/authorizations',
            method: 'put',
            headers: { Authorization: `Bearer ${getToken().refresh_token}` }
          })
          // 替换原本的token值
          saveToken({
            refresh_token: getToken().refresh_token,
            token: res.data.data.token
          })

          // 返回用户之前的请求操作，继续用户的请求
          return instance(error.config)
        } catch (error) {
          // 请求错误信息  在这里等于refresh_token值过期了才会请求错误
          // console.dir(error);
          // 重新登录
          // 提示
          Toast.fail('请重新登录')
          // 清除token
          removeToken()
          // 跳转登录页
          router.push({ path: '/login' })
        }
      } else {
        // 用户没有登录 没有token值
        // 提示
        Toast.fail('请重新登录')
        // 清除token
        removeToken()
        // 跳转登录页
        router.push({ path: '/login' })
      }
    }

    return Promise.reject(error)
  }
)

// 导出这个函数
export default instance
